import pandas as pd
import json
import os


def generate_ship_geojson(csv_file_path, output_dir="output"):
    """
    从AIS数据生成单船轨迹GeoJSON文件

    参数:
    csv_file_path: AIS数据CSV文件路径（字符串）
    output_dir: 输出文件目录
    """

    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)

    print(f"正在读取数据: {csv_file_path}")
    try:
        # 读取CSV文件
        df = pd.read_csv(csv_file_path)
        print(f"成功读取数据，总行数: {len(df)}")

        # 显示数据列名
        print("数据列名:", df.columns.tolist())

    except Exception as e:
        print(f"读取文件失败: {e}")
        return

    # 检查必要的列是否存在
    required_columns = ['MMSI', 'LAT', 'LON', 'BaseDateTime']
    for col in required_columns:
        if col not in df.columns:
            print(f"错误: 缺少必要列 '{col}'")
            print("请确认CSV文件包含以下列:", required_columns)
            return

    print("\n数据分析:")
    print(f"船舶数量: {df['MMSI'].nunique()}")  # 唯一船舶数量
    print(f"时间范围: {df['BaseDateTime'].min()} 到 {df['BaseDateTime'].max()}")

    # 选择一条船进行分析（选择数据点最多的船）
    ship_counts = df['MMSI'].value_counts()
    if len(ship_counts) == 0:
        print("没有找到船舶数据")
        return

    target_mmsi = ship_counts.index[0]  # 选择数据点最多的船
    print(f"\n选择船舶 MMSI: {target_mmsi} (有 {ship_counts.iloc[0]} 个数据点)")

    # 筛选该船的数据
    ship_df = df[df['MMSI'] == target_mmsi].copy()

    # 按时间排序
    ship_df = ship_df.sort_values('BaseDateTime')

    # 提取轨迹坐标
    coordinates = []
    for _, row in ship_df.iterrows():
        # GeoJSON格式: [经度, 纬度]
        coordinates.append([float(row['LON']), float(row['LAT'])])

    print(f"生成 {len(coordinates)} 个轨迹点")

    # 创建GeoJSON结构
    geojson_data = {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "properties": {
                    "mmsi": str(target_mmsi),
                    "point_count": len(coordinates),
                    "description": "船舶轨迹线",
                    "start_time": ship_df['BaseDateTime'].iloc[0],
                    "end_time": ship_df['BaseDateTime'].iloc[-1]
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": coordinates
                }
            }
        ]
    }

    # 保存GeoJSON文件
    output_filename = f"ship_{target_mmsi}_track.geojson"
    output_path = os.path.join(output_dir, output_filename)

    with open(output_path, 'w', encoding='utf-8') as f:
        json.dump(geojson_data, f, indent=2, ensure_ascii=False)

    print(f"\n✅ 成功生成轨迹文件!")
    print(f"文件保存位置: {output_path}")
    print(f"轨迹点数: {len(coordinates)}")
    print("\n🌍 使用方法:")
    print(f"1. 打开 https://geojson.io")
    print(f"2. 拖拽 {output_filename} 到地图页面")
    print(f"3. 查看船舶轨迹!")

    return output_path


# 使用示例
if __name__ == "__main__":
    # 你的具体文件路径
    csv_path = r"C:\Users\zhaoweizhen\Desktop\课题组信息\AIS数据\AIS_2024_01_01.csv"

    # 调用函数生成轨迹
    generate_ship_geojson(csv_path)